﻿using System;
using System.Collections.Specialized;
using System.Collections.Generic;
using Com.Alipay;
using WAD.BLL;
using WAD.Model;
using WAD.DAL;

namespace WAD.WEB.Client.API
{
    public partial class AliPay_Notify : System.Web.UI.Page
    {
        //支付宝异步回调处理
        protected void Page_Load(object sender, EventArgs e)
        {
            SortedDictionary<string, string> sPara = GetRequestPost();
            string errMsg = "";
            if (sPara.Count > 0)//判断是否有带返回参数
            {
                Notify aliNotify = new Notify();
                bool verifyResult = aliNotify.Verify(sPara, Request.Form["notify_id"], Request.Form["sign"]);
                if (verifyResult)//验证成功
                {
                    //请在这里加上商户的业务逻辑程序代码
                    //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表

                    //交易状态
                    string trade_status = sPara["trade_status"];
                    string trade_no = sPara["trade_no"];         //支付宝交易号
                    string order_no = sPara["out_trade_no"];     //获取订单号(微街秀订单号)
                    string total_fee = sPara["total_fee"];       //获取总金额
                    string subject = sPara["subject"];           //商品名称、订单名称
                    string body = sPara["body"];                 //商品描述、订单备注、描述
                    string buyer_email = sPara["buyer_email"];   //买家支付宝账号
                    string notify_time = sPara["notify_time"];   //通知时间（支付宝时间）。格式为 yyyy-MM-dd HH:mm:ss。


                    if (Request.Form["trade_status"] == "TRADE_FINISHED")
                    {
                        //判断该笔订单是否在商户网站中已经做过处理
                        //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                        //如果有做过处理，不执行商户的业务程序

                        //注意：
                        //退款日期超过可退款期限后（如三个月可退款），支付宝系统发送该交易状态通知
                        //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                    }
                    else if (Request.Form["trade_status"] == "TRADE_SUCCESS")
                    {
                        //判断该笔订单是否在商户网站中已经做过处理
                        //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                        //如果有做过处理，不执行商户的业务程序

                        //注意：
                        //付款完成后，支付宝系统发送该交易状态通知
                        //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的


                        string msg = FCOrderBLL.Pay_CallBack(order_no, total_fee, notify_time, Request.UserHostAddress, GetMsg(trade_no, order_no, buyer_email, total_fee, Request.UserHostAddress), WAD.WEB.AppCode.WJXConfig.EncryptConfig.DES_KEY);
                        if (msg.Length > 0)
                            errMsg = string.Format("订单处理失败【{0}: 订单号:{1},回调时间:{2}】", errMsg, sPara["out_trade_no"], DateTime.Now);


                    }
                    else
                    {
                    }

                    //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
                    
                    Response.Write("success");  //请不要修改或删除

                    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
                }
                else//验证失败
                {
                    errMsg = string.Format("支付宝回调失败【签名错误: 订单号:{0},回调时间:{1}】", sPara["out_trade_no"], DateTime.Now);
                    Response.Write("fail");
                }
            }
            else
            {
                errMsg = string.Format("支付宝回调失败【无通知参数: 订单号:{0},回调时间:{1}】", sPara["out_trade_no"], DateTime.Now);
                Response.Write("无通知参数");
            }

            if (!string.IsNullOrEmpty(errMsg))
            {
                DaoLogcat.Add("pay", errMsg);
            }
        }


        /// <summary>
        /// 获取支付宝POST过来通知消息，并以“参数名=参数值”的形式组成数组
        /// </summary>
        /// <returns>request回来的信息组成的数组</returns>
        public SortedDictionary<string, string> GetRequestPost()
        {
            int i = 0;
            SortedDictionary<string, string> sArray = new SortedDictionary<string, string>();
            NameValueCollection coll;
            //Load Form variables into NameValueCollection variable.
            coll = Request.Form;

            // Get names of all forms into a string array.
            String[] requestItem = coll.AllKeys;

            for (i = 0; i < requestItem.Length; i++)
            {
                sArray.Add(requestItem[i], Request.Form[requestItem[i]]);
            }

            return sArray;
        }
        
        string GetMsg(string trade_no, string order_no, string buyer_email, string total_fee,string IP)
        {
            return "{\"trade_no\":\"" + trade_no + "\",\"order_no\":\"" + order_no + "\",\"buyer_email\":\"" + buyer_email + "\",\"total_fee\":\"" + total_fee + "\",\"IP\":\"" + IP + "\"}";
        }
    }
}